// 存储变量名
const storageKey = 'storage_data';
// 存储节点变量名
const storageNodeKeys = ['avatar', 'name', 'token', 'nick', 'signature'];




/**
 * 存储管理对象，用于统一处理本地存储逻辑。
 */
export const storage = {
	/**
	 * 设置本地存储值。
	 * @param {string} key - 存储的键名。
	 * @param {*} value - 要存储的值。
	 * 如果键名在预定义的允许列表（storageNodeKeys）中，则更新或新增该键值对到本地存储。
	 * 否则，提示需先进行配置。
	 */
	set: function(key, value) {
		if (storageNodeKeys.indexOf(key) != -1) {
			let tmp = uni.getStorageSync(storageKey);
			tmp = tmp ? tmp : {};
			tmp[key] = value;
			uni.setStorageSync(storageKey, tmp);
			console.log(storageKey, '设置成功', storageData());
		} else {
			console.log('请前往storage进行配置');
		}
	},
	/**
	 * 获取本地存储值。
	 * @param {string} key - 要获取值的键名。
	 * @return {*} - 返回对应键的存储值，如果不存在则返回空字符串。
	 */
	get: function(key) {
		return storageData()[key] || '';
	},
	/**
	 * 删除本地存储中的某个键值对。
	 * @param {string} key - 要删除的键名。
	 */
	remove: function(key) {
		let tem = storageData();
		delete tem[key];
		uni.setStorageSync(storageKey, tem);
	},
	/**
	 * 清理所有本地存储数据。
	 */
	clean: function() {
		uni.removeStorageSync(storageKey);
	}
};


/**
 * storageData是一个获取当前存储数据的函数
 */
export function storageData() {
	return uni.getStorageSync(storageKey) || {};
}


//-------------------------------带有过期时间控制的本地存储功能------------------------------


// 注意：下述代码中`exporeType`应该是一个定义了时间戳、值和过期时间属性的对象，例如
const exporeType = {
	'setTime': 's',
	'value': 'v',
	'expire': 'e'
};

/**
 * 提供带有过期时间控制的本地存储功能。
 */
export const storageExpire = {

	/**
	 * 设置带有过期时间的本地存储值。
	 * @param {string} key - 存储的键名。
	 * @param {*} value - 要存储的值。
	 * @param {number} expire - 存储值的过期时间（单位：秒）。必须是数字类型。
	 * 如果提供了有效的时间期限，将创建一个包含当前时间戳、值及过期时间的对象并序列化后存储。
	 * 否则，打印错误信息提示expire的正确类型。
	 */
	set: function(key, value, expire) {
		if (expire && typeof expire === 'number') {
			let expireObj = new Object();
			expireObj[exporeType.setTime] = Date.now() / 1000;
			expireObj[exporeType.value] = value,
				expireObj[exporeType.expire] = expire;
			storage.set(key, JSON.stringify(expireObj));
		} else {
			console.log('注意 expire 的类型：', typeof expire);
		}

	},
	/**
	 * 获取带有过期时间控制的本地存储值。
	 * @param {string} key - 要获取的键名。
	 * @return {*} - 如果存储的值未过期，则返回该值；如果已过期，则删除该条存储并返回null；
	 * 如果键名不存在，则返回空字符串。
	 */
	get: function(key) {
		let storageRes = storage.get(key);
		if (storageRes) {
			let expireObj = JSON.parse(storageRes);
			if (expireObj[exporeType.expire] && (Date.now() / 1000 - expireObj[exporeType.setTime] < expireObj[
					exporeType.expire])) {
				return expireObj[exporeType.value];
			} else {
				// 时间间隔大于 期限
				storage.remove(key);
				return null;
			}

		} else {
			return '';
		}
	}
};